home *** CD-ROM | disk | FTP | other *** search
/ AGA Toolkit '97 / The AGA Toolkit '97.iso / text / misc / port / oldstuff / portsource.lha / Port138.S < prev    next >
Encoding:
Text File  |  1993-05-19  |  31.7 KB  |  2,005 lines

  1. TestMode    =    0
  2.  
  3.     INCDIR    "INCLUDE:"
  4.     INCLUDE    "Darkness.I"
  5.     INCLUDE    "Exec/FuncDef.I"
  6.     INCLUDE    "Exec/Exec_Lib.I"
  7.     INCLUDE    "Exec/Memory.I"
  8.     INCLUDE    "Dos_Lib.I"
  9.     INCLUDE    "Dos.I"
  10.  
  11. * 19-May-93
  12. * 43 days of hard coding
  13.  
  14. ; Bugs:
  15. ; Unmatching quotes fuck up everything.
  16. ; Double quote ...
  17.  
  18. ; V1.01
  19. ; - Added bigger understanding of PC box characters.
  20. ; - Now also understands one-wide box chars, and thick corner changed to #,
  21. ;   single corner to +.
  22.  
  23. ; V1.02
  24. ; - Added bad mode error, and error on no space between mode and the rest.
  25.  
  26. ; V1.10
  27. ; - Cut endspace.
  28. ; - Text output.
  29.  
  30. ; V1.13
  31. ; - Percentage & size change.
  32. ; - Extra LF.
  33. ; - Extra CR removal in ToPC mode.
  34.  
  35. ; V1.16
  36. ; - Faster translate routines - 25% speedup in FromPC.
  37. ; - 6 more in FromPC.
  38. ; - New helptext.
  39.  
  40. ; V1.18  11-Feb-93
  41. ; - Upper and lower case modes.
  42.  
  43. ; V1.22  19-Feb-93
  44. ; - Tabs to spaces:
  45. ; - 3 new PC box chars.
  46. ; - Bug fixed that confused Port if the end of the commandline had spaces.
  47. ; - Spaces to tabs.
  48.  
  49. ; V1.24  21-Feb-93
  50. ; - Size reduced by 48.
  51. ; - Bug fixed where tabconversion wasn't turned on in SpacesToTabs
  52. ;   causing some strange behavior.
  53. ; - Reduced code size by making routines use same parts of code.
  54. ; - Logic check for options.
  55. ; - +20% when quiet.
  56.  
  57. ; V1.25  11-Mar-93
  58. ; - Buffer overflow bug fixed.
  59. ; - New table conversion system.
  60. ; - Buffered input.
  61. ; - Handles one filename differently.
  62. ; - CTRL+C detection.
  63. ; - Doesn't screw up PP files.
  64. ; - 6856 -> 6636.
  65. ; - 9 new PC chars.
  66. ; - End LF removal.
  67. ; - No longer translates one space.
  68.  
  69. ; V1.28  20-Mar-93
  70. ; - First 7292 -> 6952 = -340 !
  71. ; - Bug fixed: Some bytes got cut off from the beginning if the file was
  72. ;   less than 4 bytes long.
  73. ; - Bug fix: Amy->PC didn't make CR+LF pairs as it should have in V1.25
  74. ;   same with Amy->SF
  75. ; - Most modes use table now.
  76. ; - Priorities changed for EndSpace removal and translation. This also fixes
  77. ;   the bug where endLFs didn't get removed if there were nulls or CTRL+Zs
  78. ;   etc.
  79. ; - Code rationalized, size down.
  80. ; - Doesn't trigger anything from CR's.
  81. ; - Make EOLs option.
  82. ; - Automode.
  83.  
  84. ; V1.30  27-Mar-93
  85. ; - Added 13 PC chars.
  86. ; - No longer can convert 1 space to tabs (made no sense).
  87.  
  88. ; V1.37  30-Apr-93
  89. ; - Changed automatic "Mode" to "Type".
  90. ; - Full PC->Amiga support implemented.
  91. ; - Optimized and reduced code.
  92. ; - Now uses includes.
  93. ; - Automatically find differently suffixed files by the the prefacing
  94. ;   name.
  95. ; - Ami changed to Amy.
  96. ; - A mode which throws out everything except pure ASCII stuff.
  97. ; - Fixed the slight flickering of various texts.
  98. ; - Fixed a bug which caused endspace removal to leave a space after some
  99. ;   lines when SpacesToTabs was on.
  100. ; - A fast PC->Amiga conversion routine.
  101. ; - Now you can specify only the destination directory, and the file will
  102. ;   be written correctly.
  103.  
  104. ; V1.38  5-May-03
  105. ; - Fixed some small bugs in commandline handling which caused big shit.
  106. ;   65535 bytes big, ;)
  107. ; - Fixed errors in stack handling which caused gurus on errors.
  108.  
  109. ; Things to do:
  110. ; - Load the first 10K, check, then load the rest.
  111. ; - Adjustment of the buffer sizes used for conversion.
  112. ; - Wildcards.
  113. ; - Some kind of a config file.
  114. ; - Full Amiga->PC character support.
  115. ; - Disable break when converting to same file.
  116. ; - Add exit error codes.
  117.  
  118. ; During the program:
  119. ; A0 = Source
  120. ; A1 = Dest
  121. ; A2 = Spacebuf
  122. ; A3 = Translation table
  123.  
  124. ; D0 = Current char
  125. ; D1 = Load counter
  126. ; D2 = Savebyte counter
  127. ; D3 = translation char
  128.  
  129.  
  130.     IF    TestMode=1
  131.     lea    Test_ComLine,a0
  132.     move.l    #Test_Len,d0
  133.     ENDC
  134.  
  135. ProgStart:
  136.     move.l    a7,OldStack
  137.     clr.b    -1(a0,d0.l)
  138.     movem.l    a0,-(a7)
  139.     move.w    d0,CommandLen
  140.     add.l    d0,a0
  141.     subq.l    #1,a0
  142.     move.l    a0,CommandEnd
  143.  
  144.     lea    _DosName,a1
  145.     moveq    #0,d0
  146.     move.l    ExecBase,a6
  147.     jsr    _LVOOpenLibrary(a6)
  148.     move.l    d0,_DosBase
  149.  
  150.     move.l    _DosBase,a6
  151.     jsr    _LVOOutput(a6)
  152.     move.l    d0,OutStruct
  153.  
  154.     IF    TestMode=1
  155.     bne    Err_TestMode
  156.     ENDC
  157.  
  158.     move.l    #Text_CursorOff,d2
  159.     moveq    #5,d3
  160.     bsr    PrintText
  161.  
  162.     movem.l    (a7)+,a0        ; CommandStart
  163.     tst.b    (a0)            ; If blank commandline, instructions
  164.     beq    HelpText
  165.     cmp.b    #"?",(a0)
  166.     beq    HelpText
  167.  
  168. ParseStart:
  169.     cmp.b    #"-",(a0)
  170.     beq    CheckOption
  171.  
  172. Parse:
  173.     cmp.b    #" ",1(a0)        ; at least one space after option
  174.     bne    Err_NoComLineSpace
  175.     cmp.b    #"p",(a0)
  176.     beq    FromPCMode
  177.     cmp.b    #"P",(a0)
  178.     beq    ToPCMode
  179.     cmp.b    #"s",(a0)
  180.     beq    FromSF7Mode
  181.     cmp.b    #"S",(a0)
  182.     beq    ToSF7Mode
  183.     cmp.b    #"u",(a0)
  184.     beq    ToUpCaseMode
  185.     cmp.b    #"l",(a0)
  186.     beq    ToLowCaseMode
  187.     cmp.b    #"a",(a0)
  188.     beq    AutoMode
  189.     cmp.b    #"n",(a0)
  190.     beq    ModeToNull
  191.     cmp.b    #"o",(a0)
  192.     beq    ModeToOnlyASCII
  193.     bra    Err_BadMode
  194.  
  195. *** CODE CLEANED UNTIL HERE ***
  196.  
  197. CheckOption:
  198.     cmp.b    #"e",1(a0)
  199.     beq    Opt_MakeEOLs
  200.     cmp.b    #"n",1(a0)
  201.     beq    Opt_NoCutSpace
  202.     cmp.b    #"?",1(a0)
  203.     beq    Credits
  204.     cmp.b    #"t",1(a0)
  205.     beq    Opt_TabConv
  206.     cmp.b    #"s",1(a0)
  207.     beq    Opt_SpaceConv
  208.     cmp.b    #"q",1(a0)
  209.     beq    Opt_QuietMode
  210.     cmp.b    #"b",1(a0)
  211.     beq    Opt_NoBufferMode
  212.     bra    Err_BadComLine
  213.  
  214. Opt_NoCutSpace:
  215.     tst.b    Size_MakeEOLs
  216.     bne    Err_BadLogic
  217.     move.b    #1,Mode_NoCutSpace
  218.     addq.l    #2,a0
  219.     bra    Opt_Next
  220.  
  221. Opt_TabConv:
  222.     tst.b    TabSize
  223.     bne    Err_BadLogic
  224.     move.b    2(a0),d0
  225.     cmp.b    #" ",d0
  226.     beq    Opt_TabConv1
  227.     sub.b    #"0",d0
  228.     cmp.b    #9,d0
  229.     bhi    Err_BadComLine
  230.     cmp.b    #1,d0
  231.     bcs    Err_BadComLine
  232.     bra    Opt_BothConv
  233.  
  234. Opt_TabConv1:
  235.     move.b    #8,d0
  236.     subq.l    #1,a0
  237.     bra    Opt_BothConv
  238.  
  239. Opt_SpaceConv:
  240.     tst.b    TabSize
  241.     bne    Err_BadLogic
  242.     tst.b    size_makeeols
  243.     bne    Err_badlogic
  244.     move.b    2(a0),d0
  245.     cmp.b    #" ",d0
  246.     beq    Opt_spaceconv1
  247.     sub.b    #"0",d0
  248.     cmp.b    #9,d0
  249.     bhi    Err_badcomline
  250.     cmp.b    #2,d0            ; no sense in converting to one tab
  251.     bcs    Err_badcomline        ; so 2 is the low limit
  252.     move.b    d0,spacesize
  253.     bra    Opt_bothconv
  254.  
  255. Opt_spaceconv1:
  256.     move.b    #8,d0
  257.     move.b    d0,spacesize
  258.     subq.l    #1,a0
  259.  
  260. Opt_bothconv:
  261.     move.b    d0,tabsize
  262.     addq.l    #3,a0
  263.     bra    Opt_next
  264.  
  265. Opt_quietMode:
  266.     move.b    #1,Mode_quiet
  267.     addq.l    #2,a0
  268.     bra    Opt_next
  269.  
  270. Opt_makeeols:
  271.     tst.b    spacesize
  272.     bne    Err_badlogic
  273.     move.b    2(a0),d0
  274.     cmp.b    #" ",d0
  275.     beq    Err_badcomline
  276.     sub.b    #"0",d0
  277.     cmp.b    #9,d0
  278.     bhi    Err_badcomline
  279.     cmp.b    #1,d0
  280.     bcs    Err_badcomline
  281.     move.b    3(a0),d1
  282.     cmp.b    #" ",d1
  283.     beq    Opt_makeeols1
  284.     sub.b    #"0",d1
  285.     cmp.b    #9,d1
  286.     bhi    Err_badcomline
  287.     cmp.b    #0,d1
  288.     bcs    Err_badcomline
  289.     ext.w    d0
  290.     mulu    #10,d0
  291.     add.b    d1,d0
  292.     move.b    d0,size_makeeols
  293.     addq.l    #4,a0
  294.     bra    Opt_next
  295.  
  296. Opt_makeeols1:
  297.     move.b    d0,size_makeeols
  298.     addq.l    #3,a0
  299.     bra    Opt_next
  300.  
  301. Opt_nobufferMode:
  302.     move.b    #1,Mode_nobuffer
  303.     addq.l    #2,a0
  304.  
  305. Opt_next:
  306.     cmp.b    #" ",(a0)
  307.     bne    Err_badcomline
  308.     bsr    skipspace
  309.     cmp.l    #0,a0
  310.     beq    Err_badcomline
  311.     bra    parsestart
  312.  
  313. frompcMode:
  314.     move.b    #1,Mode
  315.     move.l    #table_frompc,table
  316.     bra    nameparse
  317.  
  318. fromsf7Mode:
  319.     move.b    #2,Mode
  320.     move.l    #table_fromsf7,table
  321.     bra    nameparse
  322.  
  323. tosf7Mode:
  324.     move.b    #-2,Mode
  325.     move.l    #table_tosf7,table
  326.     bra    nameparse
  327.  
  328. topcMode:
  329.     move.b    #-1,Mode
  330.     move.l    #table_topc,table
  331.     bra    nameparse
  332.  
  333. toupcaseMode:
  334.     move.b    #3,Mode
  335.     bra    nameparse
  336.  
  337. tolowcaseMode:
  338.     move.b    #4,Mode
  339.     bra    nameparse
  340.  
  341. autoMode:
  342.     tst.b    Mode_nobuffer        ; Mode_nobuffer=0? means we have buffer
  343.     bne    Err_needbuffer        ; if not
  344.     move.b    #6,Mode
  345.     bra    nameparse
  346.  
  347. ModeToNull:
  348.     move.b    #5,Mode
  349.     move.l    #table_null,table
  350.     bra    NameParse
  351.  
  352. ModeToOnlyASCII:
  353.     move.b    #7,Mode
  354.     move.l    #Table_Null,Table
  355.  
  356. nameparse:
  357.     addq.l    #1,a0            ; one after Mode
  358.     bsr    SkipSpace
  359.     cmp.l    #0,a0
  360.     beq    Err_badcomline
  361.     move.l    a0,sourcenamestart
  362.     bsr    findend
  363.     movem.l    a0,-(a7)        ; push sourcename end in stack
  364.     addq.l    #1,a0            ; find the length for sourcename
  365.     sub.l    sourcenamestart,a0
  366.     move.l    a0,sourcenamelen
  367.  
  368.     move.l    sourcenamestart,a0
  369.     move.l    #sourcename,a1
  370.     move.l    sourcenamelen,d0
  371.     bsr    copyname
  372.     clr.b    (a1)
  373.  
  374.     move.l    #SourceName,d1        ; Now let's try to find the source
  375.     move.l    #ACCESS_READ,d2
  376.     move.l    _DosBase,a6
  377.     jsr    _LVOLock(a6)
  378.     move.l    d0,SourceLock
  379.     beq    CheckAllNames        ; If no lock, try different suffixes
  380.  
  381. CheckFile:
  382.     move.l    SourceLock,d1
  383.     move.l    #FIB,d2
  384.     move.l    _DosBase,a6
  385.     jsr    _LVOExamine(a6)
  386.     movem.l    d0,-(a7)        ; Save result code
  387.  
  388.     move.l    SourceLock,d1
  389.     move.l    _DosBase,a6
  390.     jsr    _LVOUnLock(a6)
  391.  
  392.     movem.l    (a7)+,d0
  393.     tst.l    d0            ; Boolean
  394.     beq    Err_SourceCorrupt    ; 0 means error
  395.     lea    FIB,a0
  396.     cmp.l    #0,fib_DirEntryType(a0)    ; Dir or a file?
  397.     bpl    Err_SourceIsDir        ; >=0 means directory, error
  398.     move.l    fib_Size(a0),SourceLen
  399.     move.l    #fib_FileName,a1
  400.     add.l    a0,a1
  401.     move.l    #RealSourceName,a0
  402.     exg    a0,a1
  403.     bsr    CopyUntilNull
  404.  
  405.     movem.l    (a7)+,a0        ; Get SourceName's end from stack
  406.     addq.l    #1,a0
  407.     cmp.l    CommandEnd,a0
  408.     beq    NoDest
  409.  
  410.     bsr    SkipSpace
  411.     move.l    a0,DestNameStart    ; If 0, go NoDest
  412.     beq    NoDest
  413.     bsr    FindEnd
  414.     addq.l    #1,a0            ; Add 1 to DestName end, and get
  415.     sub.l    DestNameStart,a0    ; DestNameLen in a0
  416.     move.l    a0,d0
  417.     move.l    d0,DestNameLen
  418.  
  419.     move.l    DestNameStart,a0
  420.     lea    DestName,a1
  421.     bsr    CopyName
  422.  
  423.     move.l    #DestName,d1        ; Now let's try to find the dest
  424.     move.l    #ACCESS_READ,d2
  425.     move.l    _DosBase,a6
  426.     jsr    _LVOLock(a6)
  427.     move.l    d0,DestLock
  428.     beq    OpenFiles        ; If no lock, we'll have a file.
  429.  
  430.     move.l    DestLock,d1        ; Otherwise check it
  431.     move.l    #FIB,d2
  432.     move.l    _DosBase,a6
  433.     jsr    _LVOExamine(a6)
  434.     movem.l    d0,-(a7)        ; Save result code
  435.  
  436.     move.l    DestLock,d1
  437.     move.l    _DosBase,a6
  438.     jsr    _LVOUnLock(a6)
  439.  
  440.     movem.l    (a7)+,d0
  441.     tst.l    d0            ; Boolean
  442.     beq    Err_DestCorrupt        ; 0 means error
  443.  
  444.     lea    FIB,a0
  445.     cmp.l    #0,fib_DirEntryType(a0)    ; Dir or a file?
  446.     bpl    DestIsDir        ; >=0 means directory
  447.  
  448.     bra    OpenFiles
  449.  
  450. DestIsDir:
  451.     lea    DestName,a0        ; Get DestName
  452.     add.l    DestNameLen,a0        ; Go to the end
  453.     cmp.b    #":",-1(a0)        ; If the last char is ":",
  454.     beq    LinkName
  455.     cmp.b    #"/",-1(a0)        ; or "/" just link the sourcename to it.
  456.     beq    LinkName
  457.     tst.b    -1(a0)
  458.     beq    LinkName
  459.     move.b    #"/",(a0)+
  460.  
  461. LinkName:
  462.     move.l    #RealSourceName,a1
  463.     exg    a0,a1
  464.     bsr    CopyUntilNull
  465.     bra    OpenFiles
  466.  
  467. NoDest:
  468.     move.l    SourceNameStart,a0
  469.     move.l    SourceNameLen,d0
  470.     lea    DestName,a1
  471.     bsr    CopyName
  472.  
  473.     tst.b    Mode_NoBuffer        ; If we have a buffer, no suffix, go
  474.     beq    OpenFiles1        ; OpenFiles1
  475.  
  476.     cmp.b    #-1,Mode
  477.     beq    PCSuffix
  478.     cmp.b    #-2,Mode
  479.     beq    SF7Suffix
  480.  
  481. AmigaSuffix:
  482.     lea    Text_AmigaSuf,a0
  483.     moveq    #4-1,d0
  484.     bra    AddSuffix
  485.  
  486. PCSuffix:
  487.     lea    Text_PCSuf,a0
  488.     moveq    #3-1,d0
  489.     bra    AddSuffix
  490.  
  491. SF7Suffix:
  492.     lea    Text_SF7Suf,a0
  493.     moveq    #4-1,d0
  494.  
  495. AddSuffix:
  496.     move.b    (a0)+,(a1)+
  497.     dbf    d0,AddSuffix
  498.  
  499. OpenFiles:
  500.     clr.b    (a1)            ; End of filename
  501.  
  502.     tst.b    Mode_NoBuffer
  503.     beq    OpenFiles1
  504.  
  505.     move.l    #SourceName,d1
  506.     move.l    #MODE_OLDFILE,d2
  507.     move.l    _DosBase,a6
  508.     jsr    _LVOOpen(a6)
  509.     moveq    #1,d7
  510.     move.l    d0,SourceHandle
  511.     beq    CodeError
  512.  
  513.     move.l    SourceHandle,d1
  514.     move.l    #SourceBuf,d2
  515.     move.l    #4,d3
  516.     move.l    _DosBase,a6
  517.     jsr    _LVORead(a6)
  518.     cmp.l    #4,d0
  519.     bne    OpenFiles3
  520.  
  521.     move.l    SourceBuf,d0
  522.     cmp.l    #"PP20",d0
  523.     beq    Err_PowerPacked
  524.  
  525. OpenFiles3:
  526.     move.l    SourceHandle,d1        ; seek back to the beginning of file
  527.     sub.l    d2,d2
  528.     moveq    #OFFSET_BEGINNING,d3
  529.     move.l    _DosBase,a6
  530.     jsr    _LVOSeek(a6)
  531.  
  532.     move.l    #DestName,d1
  533.     move.l    #MODE_NEWFILE,d2
  534.     move.l    _DosBase,a6
  535.     jsr    _LVOOpen(a6)
  536.     move.l    d0,DestHandle
  537.     beq    Err_NoDest
  538.  
  539.     bra    ReadBlock
  540.  
  541. CheckAllNames:
  542.     lea    SourceName,a0
  543.  
  544. CAN_NameLen:
  545.     tst.b    (a0)+            ; Loop until null found = end
  546.     bne    CAN_NameLen
  547.     subq.l    #1,a0
  548.     move.l    a0,a2            ; Where to add suffixes in a2
  549.     lea    Text_Suffixes,a1
  550.  
  551. CAN_TrySuffix:
  552.     move.b    (a1)+,(a0)+
  553.     bne    CAN_TrySuffix        ; Copy until null moved
  554.     movem.l    a0-a2,-(a7)
  555.  
  556.     move.l    #SourceName,d1
  557.     move.l    #ACCESS_READ,d2
  558.     move.l    _DosBase,a6
  559.     jsr    _LVOLock(a6)
  560.     move.l    d0,SourceLock
  561.     beq    CAN_NoSuccess        ; No lock, try next suffix
  562.     movem.l    (a7)+,a0-a2
  563.     bra    CheckFile
  564.     
  565. CAN_NoSuccess:
  566.     movem.l    (a7)+,a0-a2
  567.     cmp.b    #$ff,(a1)        ; $ff = End of suffixes
  568.     beq    Err_NoSource        ; If so, couldn't find file
  569.     move.l    a2,a0            ; Suffixplace back in a0
  570.     bra    CAN_TrySuffix        ; And try again
  571.  
  572. OpenFiles1:
  573.     lea    SourceLenASCII,a0    ; Make a string of the file length
  574.     move.l    SourceLen,d0
  575.     bsr    Num2ASCII
  576.     move.l    a0,SourceLenASCIIAddr
  577.     move.l    d0,SourceLenASCIILen
  578.  
  579.     move.l    #SourceName,d1
  580.     move.l    #MODE_OLDFILE,d2
  581.     move.l    _DosBase,a6
  582.     jsr    _LVOOpen(a6)
  583.     moveq    #2,d7
  584.     move.l    d0,SourceHandle
  585.     beq    CodeError
  586.  
  587.     move.l    SourceHandle,d1
  588.     move.l    #SourceBuf,d2
  589.     move.l    #4,d3
  590.     move.l    _DosBase,a6
  591.     jsr    _LVORead(a6)
  592.     cmp.l    #4,d0
  593.     bne    OpenFiles2
  594.  
  595.     move.l    SourceBuf,d0
  596.     cmp.l    #"PP20",d0
  597.     beq    Err_PowerPacked
  598.  
  599. OpenFiles2:
  600.     move.l    SourceHandle,d1        ; seek back to the beginning of file
  601.     sub.l    d2,d2
  602.     moveq    #OFFSET_BEGINNING,d3
  603.     move.l    _DosBase,a6
  604.     jsr    _LVOSeek(a6)
  605.  
  606.     move.l    SourceLen,d0
  607.     moveq    #MEMF_PUBLIC,d1
  608.     move.l    ExecBase,a6
  609.     jsr    _LVOAllocMem(a6)
  610.     move.l    d0,SourcePointer
  611.     beq    Err_NoMem
  612.  
  613. ReadFile:
  614.     move.l    SourceHandle,d1
  615.     move.l    SourcePointer,d2
  616.     add.l    ReadBytes,d2
  617.     move.l    #10240,d3
  618.     move.l    _DosBase,a6
  619.     jsr    _LVORead(a6)
  620.     cmp.l    #-1,d0
  621.     beq    Err_ReadFail
  622.     add.l    d0,ReadBytes
  623.     movem.l    d0,-(a7)
  624.     tst.b    Mode_Quiet
  625.     bne    TestRead
  626.  
  627.     move.l    #Text_Read,d2
  628.     moveq    #14,d3
  629.     bsr    PrintText
  630.  
  631.     lea    ReadASCII,a0
  632.     move.l    ReadBytes,d0
  633.     bsr    Num2ASCII
  634.  
  635.     move.l    a0,ReadASCIIAddr
  636.     move.l    d0,ReadASCIILen
  637.     move.l    a0,d2
  638.     move.l    d0,d3
  639.     bsr    PrintText
  640.  
  641.     move.l    #Text_Slash,d2
  642.     moveq    #1,d3
  643.     bsr    PrintText
  644.  
  645.     move.l    SourceLenASCIIAddr,d2
  646.     move.l    SourceLenASCIILen,d3
  647.     bsr    PrintText
  648.  
  649.     move.l    #Text_CR,d2
  650.     moveq    #1,d3
  651.     bsr    PrintText
  652.  
  653. TestRead:
  654.     movem.l    (a7)+,d0
  655.     tst.l    d0            ; = number of bytes read
  656.     beq    ReadFinished
  657.  
  658.     sub.l    d0,d0
  659.     sub.l    d1,d1
  660.     move.l    ExecBase,a6
  661.     jsr    _LVOSetSignal(a6)
  662.  
  663.     btst    #SIGBREAKB_CTRL_C,d0    ; check if ^C was pressed
  664.     bne    BreakPressed
  665.  
  666.     bra    ReadFile
  667.  
  668. ReadFinished:
  669.     move.l    ReadBytes,LeftBytes
  670.  
  671.     move.l    SourceHandle,d1
  672.     move.l    _DosBase,a6
  673.     jsr    _LVOClose(a6)
  674.  
  675.     cmp.b    #6,Mode            ; AutoMode on?
  676.     beq    DetectMode
  677.  
  678. ReadFinished1:
  679.     move.l    #DestName,d1
  680.     move.l    #MODE_NEWFILE,d2
  681.     move.l    _DosBase,a6
  682.     jsr    _LVOOpen(a6)
  683.     move.l    d0,DestHandle
  684.     beq    Err_NoDest
  685.  
  686.     bra    MoreData
  687.  
  688. DetectMode:
  689.     move.l    #Text_Checking,d2
  690.     moveq    #34,d3
  691.     bsr    PrintText
  692.  
  693.     sub.l    d2,d2
  694.     sub.l    d3,d3
  695.     sub.l    d4,d4
  696.     move.l    SourcePointer,a0
  697.     cmp.l    #10240,LeftBytes
  698.     bcs    DetectMode1
  699.     move.l    #10240-1,d1
  700.  
  701. DetectMode2:
  702.     move.b    (a0)+,d0
  703.     cmp.b    #"{",d0
  704.     beq    DM_sf7
  705.     cmp.b    #"[",d0
  706.     beq    DM_sf7
  707.     cmp.b    #"|",d0
  708.     beq    DM_sf7
  709.     cmp.b    #"\",d0
  710.     beq    DM_sf7
  711.  
  712.     cmp.b    #"ä",d0
  713.     beq    DM_Amy
  714.     cmp.b    #"Ä",d0
  715.     beq    DM_Amy
  716.     cmp.b    #"ö",d0
  717.     beq    DM_Amy
  718.     cmp.b    #"Ö",d0
  719.     beq    DM_Amy
  720.  
  721.     cmp.b    #$84,d0
  722.     beq    DM_PC
  723.     cmp.b    #$8e,d0
  724.     beq    DM_PC
  725.     cmp.b    #$94,d0
  726.     beq    DM_PC
  727.     cmp.b    #$99,d0
  728.     beq    DM_PC
  729.  
  730.     cmp.b    #13,d0
  731.     beq    DM_foreign
  732.  
  733. DetectMode3:
  734.     dbf    d1,DetectMode2
  735.  
  736.     cmp.l    d2,d3
  737.     beq    SameWarn1
  738.     cmp.l    d2,d4
  739.     beq    SameWarn1
  740.     cmp.l    d3,d4
  741.     beq    SameWarn2
  742.  
  743. DetectMode4:
  744.     movem.l    d2-d4,-(a7)
  745.     move.l    #Text_Uses,d2
  746.     moveq    #14,d3
  747.     bsr    PrintText
  748.     movem.l    (a7)+,d2-d4
  749.  
  750.     cmp.l    d2,d3            ; SF7 or Amy
  751.     bhi    DM_NotSF7
  752.  
  753. DM_NotAmy:
  754.     cmp.l    d2,d4            ; SF7 or PC
  755.     bhi    DM_MakePC
  756.     bra    DM_MakeSF7
  757.  
  758. DM_NotSF7:
  759.     cmp.l    d3,d4            ; Amy or PC
  760.     bhi    DM_MakePC
  761.  
  762. DM_MakeAmy:
  763.     move.b    #5,Mode
  764.     move.l    #Table_Null,Table
  765.  
  766.     move.l    #Text_NullMode,d2
  767.     moveq    #10,d3
  768.     bsr    PrintText
  769.  
  770.     bra    ReadFinished1    
  771.  
  772. DM_MakePC:
  773.     move.b    #1,Mode
  774.     move.l    #Table_FromPC,Table
  775.  
  776.     move.l    #Text_PCMode,d2
  777.     moveq    #7,d3
  778.     bsr    PrintText
  779.  
  780.     bra    ReadFinished1
  781.  
  782. DM_MakeSF7:
  783.     move.b    #2,Mode
  784.     move.l    #Table_FromSF7,Table
  785.  
  786.     move.l    #Text_SF7Mode,d2
  787.     moveq    #8,d3
  788.     bsr    PrintText
  789.  
  790.     bra    ReadFinished1
  791.  
  792. SameWarn1:
  793.     cmp.l    d3,d4
  794.     beq    Err_SameProbability
  795.     bra    DetectMode4
  796.  
  797. SameWarn2:
  798.     cmp.l    d2,d3
  799.     beq    Err_SameProbability
  800.     bra    DetectMode4
  801.  
  802. DetectMode1:
  803.     move.l    LeftBytes,d1
  804.     subq.l    #1,d1
  805.     bra    DetectMode2
  806.  
  807. DM_SF7:
  808.     addq.l    #1,d2
  809.     bra    DetectMode3
  810.  
  811. DM_Amy:
  812.     addq.l    #1,d3
  813.     bra    DetectMode3
  814.  
  815. DM_PC:
  816.     addq.l    #1,d4
  817.     bra    DetectMode3
  818.  
  819. DM_Foreign:
  820.     addq.l    #1,d2
  821.     addq.l    #1,d4
  822.     bra    DetectMode3
  823.  
  824. ReadBlock:
  825.     tst.b    Mode_NoBuffer
  826.     beq    MoreData
  827.  
  828.     move.l    SourceHandle,d1
  829.     move.l    SourcePointer,d2
  830.     move.l    #1024,d3
  831.     move.l    _DosBase,a6
  832.     jsr    _LVORead(a6)
  833.     cmp.l    #-1,d0
  834.     beq    Err_ReadFail
  835.     add.l    d0,ReadBytes
  836.     move.l    d0,d1
  837.     beq    CloseFiles        ; ReadBytes = 0 - Quit
  838.     subq.l    #1,d1            ; Counter always one less than real
  839.     sub.l    d2,d2            ; Bytes to be written zeroed
  840.     lea    SourceBuf,a0
  841.     lea    DestBuf,a1
  842.     bra    MoreCharacters
  843.  
  844. MoreData:
  845.     tst.l    LeftBytes
  846.     beq    CloseFiles
  847.     sub.l    d2,d2
  848.     cmp.l    #1024,LeftBytes
  849.     bls    MoreData1
  850.     sub.l    #1024,LeftBytes
  851.     move.l    SourcePointer,a0
  852.     add.l    InputBytes,a0
  853.     add.l    #1024,InputBytes
  854.     move.l    #1024-1,d1
  855.     lea    DestBuf,a1
  856.     bra    MoreCharacters
  857.  
  858. MoreData1:
  859.     move.l    LeftBytes,d0
  860.     clr.l    LeftBytes
  861.     move.l    SourcePointer,a0
  862.     add.l    InputBytes,a0
  863.     add.l    d0,InputBytes
  864.     subq.l    #1,d0
  865.     move.l    d0,d1
  866.     lea    DestBuf,a1
  867.  
  868. MoreCharacters:
  869.     move.b    (a0)+,d0
  870.  
  871.     cmp.b    #0,Mode            ; ToSF7 = -2, ToPC = -1
  872.     bcs    Translate
  873.  
  874.     cmp.b    #2,mode            ; FromSF7
  875.     beq    translate
  876.     cmp.b    #3,mode            ; Upcase
  877.     beq    toupcase
  878.     cmp.b    #4,mode            ; Lowcase
  879.     beq    tolowcase
  880.     cmp.b    #5,mode            ; Null
  881.     beq    translate
  882.     cmp.b    #7,Mode            ; OnlyASCII
  883.     beq    OnlyASCIIMode
  884.  
  885. FromPC:
  886.     cmp.b    #" ",d0
  887.     bcs    PC_Translate
  888.     cmp.b    #"~",d0
  889.     bhi    PC_Translate
  890.     bra    NextChar
  891.  
  892. PC_Translate:
  893.     tst.b    d0            ; The two characters not in the table
  894.     beq    NoChar
  895.     cmp.b    #$1a,d0
  896.     beq    NoChar
  897.     cmp.b    #$80,d0
  898.     bcs    NextChar
  899.     lea    Table_FromPC,a3
  900.     sub.b    #$80,d0
  901.     ext.w    d0
  902.     ext.l    d0
  903.     add.l    d0,a3
  904.     move.b    (a3),d0
  905.     beq    NoChar
  906.     bra    CutSpace
  907.  
  908. translate:
  909.     move.l    table,a3
  910.     tst.b    d0
  911.     beq    nochar
  912.  
  913. translate1:
  914.     move.w    (a3)+,d3
  915.     beq    NextChar        ; 0 = End of table
  916.     cmp.b    d3,d0
  917.     beq    translate2
  918.     bra    translate1
  919.  
  920. translate2:
  921.     lsr.w    #8,d3
  922.     move.b    d3,d0            ; If 0 = No char
  923.     beq    nochar
  924.  
  925. NextChar:
  926.     bra    CutSpace
  927.  
  928. checknormal:
  929.     move.b    d0,(a1)+
  930.     addq.l    #1,d2
  931.     addq.w    #1,col
  932.  
  933. NoChar:
  934.     dbf    d1,MoreCharacters
  935.  
  936.     move.l    DestHandle,d1        ; Write the converted data
  937.     move.l    d2,d3
  938.     add.l    d2,WrittenBytes
  939.     move.l    #DestBuf,d2
  940.     move.l    _DosBase,a6
  941.     jsr    _LVOWrite(a6)
  942.     cmp.l    #-1,d0
  943.     beq    Err_WriteFail
  944.  
  945.     sub.l    d0,d0
  946.     sub.l    d1,d1
  947.     move.l    ExecBase,a6
  948.     jsr    _LVOSetSignal(a6)
  949.  
  950.     btst    #SIGBREAKB_CTRL_C,d0    ; check if ^C was pressed
  951.     bne    EndProgram5
  952.  
  953.     tst.b    Mode_Quiet
  954.     bne    ReadBlock
  955.  
  956.     tst.b    Mode_NoBuffer
  957.     beq    AlternateOutput
  958.  
  959.     move.l    #Text_Input,d2
  960.     moveq    #15,d3
  961.     bsr    PrintText
  962.  
  963.     lea    NumberBuf,a0
  964.     move.l    ReadBytes,d0
  965.     bsr    Num2ASCII
  966.  
  967.     move.l    a0,d2
  968.     move.l    d0,d3
  969.     bsr    PrintText
  970.  
  971.     move.l    #Text_Output,d2
  972.     moveq    #18,d3
  973.     bsr    PrintText
  974.  
  975.     lea    numberbuf,a0
  976.     move.l    writtenbytes,d0
  977.     bsr    num2ascii
  978.  
  979.     move.l    a0,d2
  980.     move.l    d0,d3
  981.     bsr    PrintText
  982.  
  983.     move.l    #Text_CR,d2
  984.     moveq    #1,d3
  985.     bsr    PrintText
  986.  
  987.     bra    ReadBlock
  988.  
  989. alternateoutput:
  990.     move.l    #Text_converted,d2
  991.     moveq    #19,d3
  992.     bsr    PrintText
  993.  
  994.     lea    numberbuf,a0
  995.     move.l    inputbytes,d0
  996.     bsr    num2ascii
  997.  
  998.     move.l    a0,d2
  999.     move.l    d0,d3
  1000.     bsr    PrintText
  1001.  
  1002.     move.l    #Text_slash,d2
  1003.     moveq    #1,d3
  1004.     bsr    PrintText
  1005.  
  1006.     move.l    readasciiaddr,d2
  1007.     move.l    readasciilen,d3
  1008.     bsr    PrintText
  1009.  
  1010.     move.l    #Text_cr,d2
  1011.     moveq    #1,d3
  1012.     bsr    PrintText
  1013.  
  1014.     bra    readblock
  1015.  
  1016. cutspace:
  1017.     move.l    spacepointer,a2
  1018.     cmp.b    #" ",d0
  1019.     beq    addspace
  1020.     cmp.b    #9,d0            ; tab
  1021.     beq    addtab
  1022.     bsr    addeol            ; check if char is 10, and add eols
  1023.  
  1024.     tst.b    mode_nocutspace
  1025.     bne    cutspace2
  1026.  
  1027.     cmp.b    #10,d0            ; lf
  1028.     beq    cutspaces
  1029.  
  1030. cutspace1:                ; a character which is not a space,
  1031.     tst.b    prespace        ; tab or a linefeed.  Trigger things
  1032.     bne    insertprespace
  1033.     tst.l    tabs
  1034.     bne    linkspaces
  1035.  
  1036. cutspace3:
  1037.     tst.l    spacenumber
  1038.     bne    linkspaces2
  1039.  
  1040. cutspace4:
  1041.     cmp.b    #10,d0            ; has been buffered, nochar
  1042.     beq    nochar
  1043.     tst.b    mode_nocutspace
  1044.     beq    testforspace
  1045.  
  1046. linkeols:
  1047.     bsr    inserteols        ; insert any eols currently in buffer
  1048.  
  1049.     cmp.b    #" ",d0            ; if the char was a space or a tab,
  1050.     beq    nochar            ; we don't want it to pass straight
  1051.     cmp.b    #9,d0            ; in the buffer.  otherwise yes.
  1052.     beq    nochar
  1053.     bra    checknormal
  1054.  
  1055. testforspace:
  1056.     cmp.b    #" ",d0            ; if cutspace is on, spaces and tabs
  1057.     beq    nochar            ; don't automatically trigger eols
  1058.     cmp.b    #9,d0            ; in: they will be triggered when
  1059.     beq    nochar            ; the tabs and spaces get triggered
  1060.     bra    linkeols
  1061.  
  1062. cutspace2:
  1063.     cmp.b    #10,d0
  1064.     bne    cutspace1
  1065.     clr.w    col
  1066.     bra    cutspace1
  1067.  
  1068. addspace:
  1069.     move.b    d0,(a2)+
  1070.     move.l    a2,spacepointer
  1071.     addq.l    #1,spacenumber
  1072.     addq.w    #1,col
  1073.     bra    checkconvspace
  1074.  
  1075. addtab:
  1076.     move.b    tabsize,d4        ; if tabsize is zero, just add it in
  1077.     bne    tabconv            ; spacebuffer
  1078.     bra    addspace
  1079.  
  1080. tabconv:
  1081.     ext.w    d4            ; Convert tabsize
  1082.     ext.l    d4
  1083.     move.w    Col,d3            ; Get current column
  1084.     ext.l    d3
  1085.     divu    d4,d3            ; Divide column with tabsize -> we get
  1086.     swap    d3            ; the offset from last tab as characters
  1087.     sub.w    d3,d4            ; Get the # of spaces to the next tab
  1088.     add.l    d4,SpaceNumber
  1089.     add.w    d4,col
  1090.     subq.w    #1,d4
  1091.     move.b    #" ",d0
  1092.  
  1093. TabConv1:
  1094.     move.b    d0,(a2)+        ; Copy the spaces in the buffer
  1095.     dbf    d4,TabConv1
  1096.     move.l    a2,SpacePointer        ; And save the space buf pointer
  1097.  
  1098. CheckConvSpace:
  1099.     tst.b    spacesize        ; spacesize=0 means no space2tab
  1100.     beq    cutspace4
  1101.     cmp.l    #1,spacenumber        ; if spacenumber<1, skip
  1102.     bcs    cutspace4
  1103.     move.w    col,d5
  1104.     ext.l    d5
  1105.     move.l    spacenumber,d3
  1106.     move.b    spacesize,d4
  1107.     ext.w    d4
  1108.     ext.l    d4
  1109.  
  1110.     divu    d4,d5            ; if column is divisible by spacesize,
  1111.     swap    d5            ; go to "foundconvspace"
  1112.     tst.w    d5
  1113.     beq    foundconvspace
  1114.     bra    cutspace4        ; otherwise just continue
  1115.  
  1116. foundconvspace:
  1117.     cmp.l    #1,spacenumber        ; if only one space is won, don't
  1118.     beq    foundconvspace2
  1119.     move.l    #spacebuf,spacepointer
  1120.     addq.l    #1,tabs
  1121.     sub.l    d4,spacenumber
  1122.     bmi    foundconvspace1
  1123.     bra    cutspace4
  1124.  
  1125. foundconvspace1:
  1126.     clr.l    spacenumber
  1127.     bra    cutspace4
  1128.  
  1129. foundconvspace2:
  1130.     move.b    #1,prespace
  1131.     move.l    #spacebuf,spacepointer
  1132.     clr.l    spacenumber
  1133.     bra    cutspace4
  1134.  
  1135. cutspaces:
  1136.     clr.b    PreSpace
  1137.     clr.l    spacenumber
  1138.     clr.l    tabs
  1139.     move.l    #spacebuf,spacepointer
  1140.     clr.w    col
  1141.     bra    nochar
  1142.  
  1143. AddEOL:
  1144.     cmp.b    #10,d0
  1145.     beq    addeol1
  1146.     rts
  1147.  
  1148. addeol1:
  1149.     addq.l    #1,eols
  1150.     rts
  1151.  
  1152. linkspaces:
  1153.     tst.b    mode_nocutspace
  1154.     bne    linkspaces4
  1155.     bsr    inserteols
  1156.  
  1157. linkspaces4:
  1158.     move.l    tabs,d3
  1159.     clr.l    tabs
  1160.     add.l    d3,d2            ; tabs -> bytes to be written
  1161.     subq.l    #1,d3
  1162.  
  1163. linkspaces1:
  1164.     move.b    #9,(a1)+
  1165.     dbf    d3,linkspaces1
  1166.     bra    cutspace3
  1167.  
  1168. linkspaces2:
  1169.     tst.b    mode_nocutspace
  1170.     bne    linkspaces5
  1171.     bsr    inserteols
  1172.  
  1173. linkspaces5:
  1174.     move.l    spacenumber,d3
  1175.     tst.b    size_makeeols
  1176.     bne    ls_checkmakeeols
  1177. linkspaces6:
  1178.     add.l    d3,d2            ; spaces -> bytes to be written
  1179.     subq.l    #1,d3
  1180.     lea    spacebuf,a2
  1181.     move.l    a2,spacepointer
  1182.  
  1183. linkspaces3:
  1184.     move.b    (a2)+,(a1)+
  1185.     dbf    d3,linkspaces3
  1186.     clr.l    spacenumber
  1187.     bra    cutspace4
  1188.  
  1189. LS_CheckMakeEOLs:
  1190.     cmp.b    size_makeeols,d3
  1191.     bcs    linkspaces6
  1192.     addq.l    #1,d2
  1193.     move.b    #10,(a1)+
  1194.     clr.l    spacenumber
  1195.     move.l    #spacebuf,spacepointer
  1196.     bra    cutspace4
  1197.  
  1198. insertprespace:
  1199.     clr.b    prespace
  1200.     move.b    #" ",(a1)+
  1201.     addq.l    #1,d2
  1202.     bra    cutspace1
  1203.  
  1204. toupcase:
  1205.     cmp.b    #"ä",d0
  1206.     beq    Amy_upae
  1207.     cmp.b    #"ö",d0
  1208.     beq    Amy_upoe
  1209.     cmp.b    #"a",d0
  1210.     bcs    nextchar
  1211.     cmp.b    #"z",d0
  1212.     bhi    nextchar
  1213.  
  1214.     and.b    #%11011111,d0
  1215.     bra    nextchar
  1216.  
  1217. tolowcase:
  1218.     cmp.b    #"Ä",d0
  1219.     beq    Amy_lowae
  1220.     cmp.b    #"Ö",d0
  1221.     beq    Amy_lowoe
  1222.     cmp.b    #"A",d0
  1223.     bcs    nextchar
  1224.     cmp.b    #"Z",d0
  1225.     bhi    nextchar
  1226.  
  1227.     or.b    #%100000,d0
  1228.     bra    nextchar
  1229.  
  1230. OnlyASCIIMode:
  1231.     btst    #7,d0
  1232.     bne    NoChar
  1233.     bra    Translate
  1234.  
  1235. Amy_lowae:
  1236.     move.b    #"ä",d0
  1237.     bra    nextchar
  1238.  
  1239. Amy_lowoe:
  1240.     move.b    #"ö",d0
  1241.     bra    nextchar
  1242.  
  1243. Amy_upae:
  1244.     move.b    #"Ä",d0
  1245.     bra    nextchar
  1246.  
  1247. Amy_upoe:
  1248.     move.b    #"Ö",d0
  1249.     bra    nextchar
  1250.  
  1251. closefiles:
  1252.     tst.b    mode_nobuffer
  1253.     beq    freebuffer
  1254.     bsr    closesource
  1255.     bra    closefiles3
  1256.  
  1257. freebuffer:
  1258.     bsr    freememory
  1259.  
  1260. closefiles3:
  1261.     bsr    closedest
  1262.  
  1263.     move.l    #Text_final,d2
  1264.     moveq    #26,d3
  1265.     bsr    PrintText
  1266.  
  1267.     move.l    readbytes,d1
  1268.     move.l    writtenbytes,d0
  1269.  
  1270.     sub.l    d1,d0
  1271.     bmi    closefiles1        ; Negative
  1272.  
  1273.     move.l    d0,d7
  1274.     beq    closefiles2        ; If zero, no sign
  1275.  
  1276.     move.l    #Text_possign,d2
  1277.     moveq    #1,d3
  1278.     bsr    PrintText
  1279.     bra    closefiles2
  1280.  
  1281. closefiles1:
  1282.     neg.l    d0
  1283.     move.l    d0,d7
  1284.  
  1285.     move.l    #Text_negsign,d2
  1286.     moveq    #1,d3
  1287.     bsr    PrintText
  1288.  
  1289. closefiles2:
  1290.     move.l    d7,d0
  1291.     lea    numberbuf,a0
  1292.     bsr    num2ascii
  1293.  
  1294.     move.l    a0,d2
  1295.     move.l    d0,d3
  1296.     bsr    PrintText
  1297.  
  1298.     move.l    #Text_doublespace,d2
  1299.     moveq    #2,d3
  1300.     bsr    PrintText
  1301.  
  1302.     move.l    writtenbytes,d0
  1303.     move.l    readbytes,d1
  1304.     bsr    percentage
  1305.  
  1306.     lea    numberbuf,a0
  1307.     bsr    num2ascii
  1308.  
  1309.     move.l    a0,d2
  1310.     move.l    d0,d3
  1311.     bsr    PrintText
  1312.  
  1313.     move.l    #Text_percentsign,d2
  1314.     move.l    #5,d3
  1315.     bsr    PrintText
  1316.  
  1317.     move.l    #Text_lf,d2
  1318.     move.l    #1,d3
  1319.     bsr    PrintText
  1320.     bra    EndProgram1
  1321.  
  1322. helptext:
  1323.     move.l    #Text_helptext,d2
  1324.     move.l    #len_helptext,d3
  1325.     bsr    PrintText
  1326.     bra    EndProgram1
  1327.  
  1328. credits:
  1329.     move.l    #Text_credits,d2
  1330.     move.l    #len_credits,d3
  1331.     bsr    PrintText
  1332.     bra    EndProgram1
  1333.  
  1334. CodeError:
  1335.     movem.l    d7,-(a7)
  1336.     move.l    #Text_CodeError,d2
  1337.     move.l    #Len_CodeError,d3
  1338.     bsr    PrintText
  1339.     lea    NumberBuf,a0
  1340.     movem.l    (a7)+,d0
  1341.     bsr    Num2ASCII
  1342.     move.l    a0,d2
  1343.     move.l    d0,d3
  1344.     bsr    PrintText
  1345.     bra    EndProgram1
  1346.  
  1347.     IF    TestMode=1
  1348.  
  1349. Err_TestMode:
  1350.     move.l    #$ffff,d0
  1351.  
  1352. Err_TestMode1:
  1353.     move.w    #$f00,$dff180
  1354.     dbf    d0,Err_TestMode1
  1355.     bra    EndProgram1
  1356.  
  1357.     ENDC
  1358.  
  1359. Err_NoSource:
  1360.     move.l    #Text_NoSource,d2
  1361.     moveq    #28,d3
  1362.     bsr    PrintError
  1363.     bra    EndProgram1
  1364.  
  1365. Err_badcomline:
  1366.     move.l    #Text_badcomline,d2
  1367.     moveq    #17,d3
  1368.     bsr    printerror
  1369.     bra    EndProgram1
  1370.  
  1371. Err_NoDest:
  1372.     move.l    #Text_nodest,d2
  1373.     moveq    #33,d3
  1374.     bsr    printerror
  1375.     bra    EndProgram2
  1376.  
  1377. Err_badmode:
  1378.     move.l    #Text_badmode,d2
  1379.     moveq    #24,d3
  1380.     bsr    printerror
  1381.     bra    EndProgram1
  1382.  
  1383. Err_nocomlinespace:
  1384.     move.l    #Text_nocomlinespace,d2
  1385.     moveq    #52,d3
  1386.     bsr    printerror
  1387.     bra    EndProgram1
  1388.  
  1389. Err_badlogic:
  1390.     move.l    #Text_badlogic,d2
  1391.     moveq    #25,d3
  1392.     bsr    printerror
  1393.     bra    EndProgram1
  1394.  
  1395. Err_nomem:
  1396.     move.l    #Text_nomemory,d2
  1397.     moveq    #36,d3
  1398.     bsr    printerror
  1399.     bsr    closesource
  1400.     bra    EndProgram1
  1401.  
  1402. Err_powerpacked:
  1403.     move.l    #Text_powerpacked,d2
  1404.     moveq    #48,d3
  1405.     bsr    printerror
  1406.     bsr    closesource
  1407.     bra    EndProgram1
  1408.  
  1409. Err_seekfail:
  1410.     move.l    #Text_badsource,d2
  1411.     moveq    #23,d3
  1412.     bsr    printerror
  1413.     bsr    closesource
  1414.     bra    EndProgram1
  1415.  
  1416. Err_readfail:
  1417.     move.l    #Text_badsource,d2
  1418.     moveq    #23,d3
  1419.     bsr    printerror
  1420.     bra    EndProgram3
  1421.  
  1422. Err_SourceCorrupt:
  1423.     move.l    #Text_BadSource,d2
  1424.     moveq    #23,d3
  1425.     bsr    PrintError
  1426.     bra    EndProgram1
  1427.  
  1428. Err_DestCorrupt:
  1429.     move.l    #Text_BadDest,d2
  1430.     moveq    #23,d3
  1431.     bsr    PrintError
  1432.     bra    EndProgram1
  1433.  
  1434. Err_SourceIsDir:
  1435.     move.l    #Text_SourceIsDir,d2
  1436.     moveq    #28,d3
  1437.     bsr    PrintError
  1438.     bra    EndProgram1
  1439.  
  1440. Err_WriteFail:
  1441.     move.l    #Text_WriteFail,d2
  1442.     moveq    #18,d3
  1443.     bsr    printerror
  1444.     bra    EndProgram3
  1445.  
  1446. Err_needbuffer:
  1447.     move.l    #Text_needbuffer,d2
  1448.     moveq    #42,d3
  1449.     bsr    printerror
  1450.     bra    EndProgram1
  1451.  
  1452. Err_sameprobability:
  1453.     move.l    #Text_sameprobability,d2
  1454.     moveq    #28,d3
  1455.     bsr    printerror
  1456.     bsr    freememory
  1457.     bra    EndProgram1
  1458.  
  1459. EndProgram5:
  1460.     tst.b    mode_nobuffer
  1461.     beq    EndProgram6
  1462.  
  1463.     bsr    closesource
  1464.     bsr    closedest
  1465.  
  1466.     move.l    #destname,d1
  1467.     move.l    _DosBase,a6
  1468.     jsr    _LVODeleteFile(a6)        ; *!* Error detection here
  1469.  
  1470.     move.l    #Text_break,d2
  1471.     moveq    #20,d3
  1472.     bsr    PrintText
  1473.     bra    EndProgram1
  1474.  
  1475. EndProgram6:
  1476.     bsr    closedest
  1477.     bsr    freememory
  1478.  
  1479.     move.l    #destname,d1
  1480.     move.l    _DosBase,a6
  1481.     jsr    _LVODeleteFile(a6)        ; error detection here
  1482.  
  1483.     move.l    #Text_break,d2
  1484.     moveq    #20,d3
  1485.     bsr    PrintText
  1486.     bra    EndProgram1
  1487.  
  1488. breakpressed:                ; source and mem open, dest not
  1489.     bsr    freememory
  1490.     bsr    closesource
  1491.     move.l    #Text_break,d2
  1492.     moveq    #20,d3
  1493.     bsr    PrintText
  1494.     bra    EndProgram1
  1495.  
  1496.     bsr    closedest
  1497.  
  1498. EndProgram3:
  1499.     bsr    closesource
  1500.     tst.b    mode_nobuffer
  1501.     beq    EndProgram3_1
  1502.     bsr    closedest
  1503.     bra    EndProgram1
  1504.  
  1505. EndProgram3_1:
  1506.     bsr    freememory
  1507.     bra    EndProgram1
  1508.  
  1509. EndProgram2:
  1510.     tst.l    SourceHandle        ; closes source if it's open
  1511.     beq    EndProgram1
  1512.     bsr    CloseSource
  1513.  
  1514. EndProgram1:
  1515.     move.l    #Text_cursoron,d2
  1516.     moveq    #5,d3
  1517.     bsr    PrintText
  1518.  
  1519.     move.l    ExecBase,a6
  1520.     move.l    _DosBase,a1
  1521.     jsr    _LVOCloseLibrary(a6)
  1522.     sub.l    d0,d0
  1523.     move.l    OldStack,a7
  1524.     rts
  1525.  
  1526.  
  1527. **********
  1528. ** SUBS **
  1529. **********
  1530.  
  1531. inserteols:
  1532.     move.l    eols,d3
  1533.     bne    inserteols1
  1534.     rts
  1535.  
  1536. inserteols1:
  1537.     add.l    d3,d2
  1538.     subq.l    #1,d3
  1539.  
  1540. inserteols2:
  1541.     cmp.b    #0,mode        ; if mode is negative, adds crs
  1542.     bmi    insertcr
  1543. inserteols3:
  1544.     move.b    #10,(a1)+
  1545.     dbf    d3,inserteols2
  1546.     clr.l    eols
  1547.     rts
  1548.  
  1549. InsertCR:
  1550.     move.b    #13,(a1)+
  1551.     addq.l    #1,d2
  1552.     bra    InsertEOLs3
  1553.  
  1554. freememory:
  1555.     move.l    sourcepointer,a1
  1556.     move.l    sourcelen,d0
  1557.     move.l    ExecBase,a6
  1558.     jsr    _LVOFreeMem(a6)
  1559.     rts
  1560.  
  1561. closedest:
  1562.     move.l    desthandle,d1
  1563.     move.l    _DosBase,a6
  1564.     jsr    _LVOClose(a6)
  1565.     rts
  1566.  
  1567. closesource:
  1568.     move.l    sourcehandle,d1
  1569.     move.l    _DosBase,a6
  1570.     jsr    _LVOclose(a6)
  1571.     rts
  1572.  
  1573. printerror:
  1574.     movem.l    d2/d3,-(a7)
  1575.     move.l    #Text_error,d2
  1576.     move.l    #8,d3
  1577.     bsr    PrintText
  1578.     movem.l    (a7)+,d2/d3
  1579.     bsr    PrintText
  1580.     rts
  1581.  
  1582. PrintText:
  1583.     if    testmode=1
  1584.     rts
  1585.     endc
  1586.  
  1587.     move.l    outstruct,d1
  1588.     move.l    _DosBase,a6
  1589.     jsr    _LVOwrite(a6)
  1590.     rts
  1591.  
  1592. SkipSpace:
  1593.     cmp.b    #" ",(a0)
  1594.     beq    SkipSpace1
  1595.     rts
  1596.  
  1597. SkipSpace1:
  1598.     addq.l    #1,a0
  1599.     cmp.l    CommandEnd,a0
  1600.     bcs    SkipSpace
  1601.     sub.l    a0,a0
  1602.     rts
  1603.  
  1604. FindEnd:
  1605.     cmp.b    #'"',(a0)        ; If the first letter is a quote,
  1606.     beq    FindEnd_Quote        ; go to FindEnd_Quote
  1607.  
  1608. FindEnd_Space:
  1609.     addq.l    #1,a0            ; Get the next position, if it is a
  1610.     cmp.b    #" ",(a0)        ; space, we found the end
  1611.     beq    FindEnd_Space1
  1612.     tst.b    (a0)            ; If it's the end of comline, we found
  1613.     beq    FindEnd_Space1        ; the end of name
  1614.     bra    FindEnd_Space
  1615.  
  1616. FindEnd_Space1:
  1617.     subq.l    #1,a0
  1618.     rts
  1619.  
  1620. FindEnd_Quote:
  1621.     addq.l    #1,a0
  1622.     tst.b    (a0)            ; If end of comline, error
  1623.     beq    FindEnd_Quote2
  1624.     cmp.b    #'"',(a0)
  1625.     bne    FindEnd_Quote
  1626.     rts
  1627.  
  1628. FindEnd_Quote2:
  1629.     sub.l    a0,a0
  1630.     rts
  1631.  
  1632. CopyUntilNull:
  1633.     move.b    (a0)+,(a1)+
  1634.     bne    CopyUntilNull
  1635.     rts
  1636.  
  1637.     INCDIR    "SRC:Routines/"
  1638.     INCLUDE    "Num2ASCII.S"
  1639.     INCLUDE    "Percentage.S"
  1640.     INCLUDE    "CopyName.S"
  1641.  
  1642. **********
  1643. ** DATA **
  1644. **********
  1645.  
  1646.     section    fastdata,data
  1647.  
  1648. SourcePointer:
  1649.     dc.l    SourceBuf
  1650.  
  1651. SpacePointer:
  1652.     dc.l    SpaceBuf
  1653.  
  1654. ***********************
  1655. ** Conversion tables **
  1656. ***********************
  1657.  
  1658. ; The byte from which to convert is on the right, and the byte into which it
  1659. ; turns is on the left.  If a null is on the left, it means the byte doesn't
  1660. ; get to the destination file at all.
  1661.  
  1662.  
  1663. table_topc:
  1664.     dc.b    $00,$0d
  1665.     dc.b    $00,$1a
  1666.     dc.b    $84,"ä"
  1667.     dc.b    $8e,"Ä"
  1668.     dc.b    $94,"ö"
  1669.     dc.b    $99,"Ö"
  1670.     dc.w    0
  1671.  
  1672. table_null:
  1673.     dc.b    $00,$0d
  1674.     dc.b    $00,$1a
  1675.     dc.w    0
  1676.  
  1677. table_tosf7:
  1678.     dc.b    $00,$0d
  1679.     dc.b    $00,$1a
  1680.     dc.b    "{","ä"
  1681.     dc.b    "|","ö"
  1682.     dc.b    "[","Ä"
  1683.     dc.b    "\","Ö"
  1684.     dc.w    0
  1685.  
  1686. table_fromsf7:
  1687.     dc.b    $00,$0d
  1688.     dc.b    $00,$1a
  1689.     dc.b    "ä","{"
  1690.     dc.b    "ö","|"
  1691.     dc.b    "Ä","["
  1692.     dc.b    "Ö","\"
  1693.     dc.w    0
  1694.  
  1695. Table_FromPC:    ; 0  1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  1696.     dc.b    $e7,$dc,"e","å","ä","a","a",$e7,$ea,$eb,"e",$ef,$ee,"i","Ä","a"
  1697.     dc.b    "E",$e6,$c6,$f4,"ö","o",$fb,"u",$ff,"Ö",$dc,$a2,$a3,$a5,"P","f"
  1698.     dc.b    "a","i","o","u","n","N",$aa,$ba,$bf,"+","+",$bd,$bc,$a1,$ab,$bb
  1699.     dc.b    $7f,$7f,$7f,"|","+","#","#","+","#","#","|","#","+","#","+","+"
  1700.     dc.b    "+","+","+","-","-","#","#","#","#","#","#","=","#","#","#","#"
  1701.     dc.b    "#","+","#","#","+","#","#","#","#","+","+",$7f,"_","|","|","¯"
  1702.     dc.b    "c",$df,"r","#","E",$d3,"y",$ed,"o","0","o",$f3,"°","0","E","A"
  1703.     dc.b    "=",$b1,">","<","i","j",$f7,"~","°",$b7,$b7,"V","n",$b2,$b7," "
  1704.  
  1705.     INCDIR    "SRC:Port/"
  1706.  
  1707. Text_CodeError:
  1708.     INCBIN    "PortCodeError"
  1709.  
  1710. Text_helptext:
  1711.     INCBIN    "PortOpts1"        ; Don't change the way these lines are
  1712.                     ; arranged!
  1713. Text_credits:
  1714.     INCBIN    "PortOpts2"
  1715.  
  1716. Text_CursorOff:
  1717.     dc.b    27,"[0 p"
  1718.  
  1719. Text_CursorOn:
  1720.     dc.b    27,"[1 p"
  1721.  
  1722. Text_Error:
  1723.     dc.b    "ERROR!  "
  1724.  
  1725. Text_BadComLine:
  1726.     dc.b    "Bad commandline.",10
  1727.  
  1728. Text_NoSource:
  1729.     dc.b    "Could not open source file.",10
  1730.  
  1731. Text_NoDest:
  1732.     dc.b    "Could not open destination file.",10
  1733.  
  1734. Text_SourceIsDir:
  1735.     dc.b    "Source file is a directory.",10
  1736.  
  1737. Text_badmode:
  1738.     dc.b    "Bad mode specification.",10
  1739.  
  1740. Text_WriteFail:
  1741.     dc.b    "Can't write data.",10
  1742.  
  1743. Text_nocomlinespace:
  1744.     dc.b    "The mode must be separated with at least one space.",10
  1745.  
  1746. Text_badlogic:
  1747.     dc.b    "Conflict in commandline.",10
  1748.  
  1749. Text_nomemory:
  1750.     dc.b    "Not enough memory to load the file.",10
  1751.  
  1752. Text_powerpacked:
  1753.     dc.b    "File is a PowerPacker data file, can't process.",10
  1754.  
  1755. Text_badsource:
  1756.     dc.b    "Source file corrupted.",10
  1757.  
  1758. Text_BadDest:
  1759.     dc.b    "Destination corrupted.",10
  1760.  
  1761. Text_needbuffer:
  1762.     dc.b    "Auto-mode only works with buffered input.",10
  1763.  
  1764. Text_SameProbability:
  1765.     dc.b    "Can't decide between modes.",10
  1766.  
  1767. Text_input:
  1768.     dc.b    27,"[1mInput:",27,"[0m "
  1769.  
  1770. Text_output:
  1771.     dc.b    "  ",27,"[1mOutput:",27,"[0m "
  1772.  
  1773. Text_read:
  1774.     dc.b    27,"[1mRead:",27,"[0m "
  1775.  
  1776. Text_converted:
  1777.     dc.b    27,"[1mConverted:",27,"[0m "
  1778.  
  1779. Text_checking:
  1780.     dc.b    27,"[1mChecking file type...",27,"[0m",27,"[0K",13
  1781.  
  1782. Text_uses:
  1783.     dc.b    27,"[1mType:",27,"[0m "
  1784.  
  1785. Text_nullmode:
  1786.     dc.b    "Amiga",27,"[0K",10
  1787.  
  1788. Text_sf7mode:
  1789.     dc.b    "SF7",27,"[0K",10
  1790.  
  1791. Text_PCmode:
  1792.     dc.b    "PC",27,"[0K",10
  1793.  
  1794. Text_break:
  1795.     dc.b    27,"[1m-BREAK-",27,"[0m",27,"[0K",10
  1796.  
  1797. Text_cleareol:
  1798.     dc.b    27,"[0K"
  1799.  
  1800. _DosName:
  1801.     dc.b    "dos.library",0
  1802.  
  1803. Text_amigasuf:
  1804.     dc.b    ".AMY"
  1805.  
  1806. Text_PCsuf:
  1807.     dc.b    ".PC"
  1808.  
  1809. Text_sf7suf:
  1810.     dc.b    ".SF7"
  1811.  
  1812. Text_CR:
  1813.     dc.b    13
  1814.  
  1815. Text_LF:
  1816.     dc.b    10
  1817.  
  1818. Text_Final:
  1819.     dc.b    27,"[1mFile size change:",27,"[0m "
  1820.  
  1821. Text_negsign:
  1822.     dc.b    "-"
  1823.  
  1824. Text_possign:
  1825.     dc.b    "+"
  1826.  
  1827. Text_percentsign:
  1828.     dc.b    "%",27,"[0K"
  1829.  
  1830. Text_doublespace:
  1831.     dc.b    "  "
  1832.  
  1833. Text_slash:
  1834.     dc.b    "/"
  1835.  
  1836. Text_Suffixes:
  1837.     dc.b    ".TXT",0
  1838.     dc.b    ".DOC",0
  1839.     dc.b    ".AMY",0
  1840.     dc.b    ".SF7",0
  1841.     dc.b    ".PC",0
  1842.     dc.b    ".ASC",0
  1843.     dc.b    ".ANS",0
  1844.     dc.b    ".LST",0
  1845.     dc.b    ".NFO",0
  1846.     dc.b    $ff
  1847.  
  1848.     IF    TestMode=1
  1849.  
  1850. Test_ComLine:
  1851.     dc.b    'p -s5 src:port/portopts1 ram:shit',10
  1852.  
  1853. Test_ComLineEnd:
  1854.  
  1855. Test_Len    =    Test_ComLineEnd-Test_ComLine
  1856.  
  1857.     ENDC
  1858.  
  1859.     SECTION    FastBlank,BSS
  1860.  
  1861. FIB:
  1862.     ds.b    fib_SIZEOF
  1863.  
  1864. OldStack:
  1865.     ds.l    1
  1866.  
  1867. DestNameLen:
  1868.     ds.l    1
  1869.  
  1870. SourceLock:
  1871.     ds.l    1
  1872.  
  1873. DestLock:
  1874.     ds.l    1
  1875.  
  1876. eols:
  1877.     ds.l    1
  1878.  
  1879. readasciiaddr:
  1880.     ds.l    1
  1881.  
  1882. table:
  1883.     ds.l    1
  1884.  
  1885. sourcelen:
  1886.     ds.l    1
  1887.  
  1888. tabs:
  1889.     ds.l    1
  1890.  
  1891. writtenbytes:
  1892.     ds.l    1
  1893.  
  1894. readbytes:
  1895.     ds.l    1
  1896.  
  1897. leftbytes:
  1898.     ds.l    1
  1899.  
  1900. inputbytes:
  1901.     ds.l    1
  1902.  
  1903. sourcehandle:
  1904.     ds.l    1
  1905.  
  1906. desthandle:
  1907.     ds.l    1
  1908.  
  1909. outstruct:
  1910.     ds.l    1
  1911.  
  1912. destnamestart:
  1913.     ds.l    1
  1914.  
  1915. sourcenamestart:
  1916.     ds.l    1
  1917.  
  1918. sourcenamelen:
  1919.     ds.l    1
  1920.  
  1921. commandstarrt:
  1922.     ds.l    1
  1923.  
  1924. commandend:
  1925.     ds.l    1
  1926.  
  1927. commandlen:
  1928.     ds.l    1
  1929.  
  1930. _DosBase:
  1931.     ds.l    1
  1932.  
  1933. spacenumber:
  1934.     ds.l    1
  1935.  
  1936. readasciilen:
  1937.     ds.l    1
  1938.  
  1939. sourcelenasciilen:
  1940.     ds.l    1
  1941.  
  1942. sourcelenasciiaddr:
  1943.     ds.l    1
  1944.  
  1945. col:
  1946.     ds.w    1
  1947.  
  1948. sourcebuf:
  1949.     ds.b    1024
  1950.  
  1951. RealSourceName:
  1952.     ds.b    108            ; Max filename size in FIB
  1953.  
  1954. sourcename:
  1955.     ds.b    256
  1956.  
  1957. destname:
  1958.     ds.b    256
  1959.  
  1960. destbuf:
  1961.     ds.b    9216
  1962.  
  1963. spacebuf:
  1964.     ds.b    1024
  1965.  
  1966. numberbuf:
  1967.     ds.b    10
  1968.  
  1969. readascii:
  1970.     ds.b    10
  1971.  
  1972. sourcelenascii:
  1973.     ds.b    10
  1974.  
  1975. mode:
  1976.     ds.b    1
  1977.  
  1978. tabsize:
  1979.     ds.b    1
  1980.  
  1981. spacesize:
  1982.     ds.b    1
  1983.  
  1984. size_makeeols:
  1985.     ds.b    1
  1986.  
  1987. prespace:
  1988.     ds.b    1
  1989.  
  1990. mode_case:
  1991.     ds.b    1
  1992.  
  1993. mode_nocutspace:
  1994.     ds.b    1
  1995.  
  1996. mode_quiet:
  1997.     ds.b    1
  1998.  
  1999. mode_nobuffer:
  2000.     ds.b    1
  2001.  
  2002. Len_CodeError    =    Text_HelpText-Text_CodeError
  2003. Len_HelpText    =    Text_Credits-Text_HelpText
  2004. Len_Credits    =    Text_CursorOff-Text_Credits
  2005.